home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / assembler / progasm1.lha / SORGENTI / LEZIONE2f.s < prev    next >
Text File  |  1980-01-09  |  8KB  |  138 lines

  1.  
  2. ; Lezione2f.s
  3.  
  4. Inizio:
  5.     lea    START,a0    ; metti in a0 l'indirizzo da dove iniziare
  6.                 ; ovvero in a0 va l'indirizzo di START, ossia
  7.                 ; DOVE si trova START, non cosa contiene!
  8.     lea    THEEND,a1    ; metti in a1 l'indirizzo dove finire
  9.                 ; Ossia si mette l'indirizzo della fine dei
  10.                 ; 40 bytes, infatti sta SOTTO i 40 bytes.
  11.                 ; Ora, TUTTO QUELLO CHE SI TROVA TRA la label
  12.                 ; START: e la LABEL THEEND: verra' pulito
  13.                 ; da LOOP CLELOOP:, siano essi 40 bytes
  14.                 ; o di piu', anche se ci mettete delle
  15.                 ; istruzioni.
  16.  
  17. CLELOOP:
  18.     clr.l    (a0)+    ; Azzera la long in (a0), poi aggiungi 4 ad a0 (long!)
  19.             ; ATTENZIONE! Questo e' un indirizzamento indiretto,
  20.             ; in cui non si cancella il registro a0, ma il
  21.             ; contenuto dell'indirizzo, ossia 4 $FE alla volta,
  22.             ; ($fe e' un numero a caso che ho messo tanto per
  23.             ; esempio per distinguerlo dagli zeri! per dimostrare
  24.             ; che pulisco parto da una zona riempita con degli $FE;
  25.             ; essendoci un + dopo la parantesi, ogni volta che
  26.             ; viene eseguita il valore di a0 aumenta di 4, ossia
  27.             ; si mette al prossimo indirizzo da pulire)
  28.             ; (Il primo passaggio vengono azzerati i primi 4
  29.             ; $FE sotto start, il secondo passaggio i 4 seguenti
  30.             ; e cosi' via). da notare che aumenta soltanto a0,
  31.             ; mentre a1 rimane fermo all'indirizzo THEEND.
  32.     cmp.l    a0,a1    ; a0 e' uguale ad a1? Cioe' siamo all'indirizzo THEEND?
  33.             ; (Infatti a0 aumenta di 4 ogni ciclo, e fermiamo il
  34.             ; ciclo quando a0 raggiunge l'indirizzo THEEND)
  35.     bne.s    CLELOOP    ; se no, torna ad eseguire CLELOOP...
  36.     rts        ; ESCI dal prog e torna ad ASMONE
  37.  
  38. START:
  39.     dcb.b    40,$fe    ; Il comando DCB serve per mettere in memoria un
  40.             ; numero definito di byte, word o long uguali tra
  41.             ; di loro: similmente al comando DC.B, in cui in
  42.             ; questo caso avremmo dovuto fare dc.b $fe,$fe,$fe...
  43.             ; mettendo 40 $fe. Invece col comando dcb possiamo
  44.             ; fare piu' semplicemente dcb.b 40,$fe, ossia
  45.             ; METTI QUA IN MEMORIA 40 bytes $fe.
  46. THEEND:        ; questa label segna la fine dei 40 bytes...
  47.  
  48.     dcb.b    10,0    ; mettiamo 10 bytes azzerati qua tanto per sfizio
  49.  
  50.     end
  51.  
  52. Attenzione! con LEA START,a0, in a0 c'e' l'indirizzo del primo dei 40 bytes
  53. $fe, e non contiene i 40 bytes!!! La LABEL e' una convenzione usata nella
  54. programmazione per orientarsi nel listato, infatti servono per dare un nome
  55. alle varie parti del programma, siano esse istruzioni o altro, poi riferendoci
  56. a quella LABEL ci riferiremo AL PUNTO ESATTO IN CUI E' MESSA LA LABEL, cioe'
  57. l'indirizzo dove sta la label; per evitare confusioni, immaginatevi come mai
  58. sono state inventate le LABEL: se non ci fossero state, avremmo dovuto
  59. numerare ogni byte, ossia ragionare per indirizzi, ad esempio unvece di
  60. fare un BNE.S CLELOOP avremmo dovuto scrivere direttamente BNE.S $20398, ad
  61. esempio, cioe' scrivere l'indirizzo di partenza del loop, ossia dove si trovava
  62. il clr.l (a0)+, allo stesso modo, invece di scrivere LEA START,a0 avremmo
  63. dovuto scrivere lea $123456,a0, cioe' l'indirizzo da dove partire per pulire.
  64. Immaginatevi poi se avessimo inserito un istruzione in piu' nel ciclo! in
  65. questo caso START si sarebbe spostato in avanti, e avremmo dovuto riscrivere
  66. il numero esatto nel LEA $123456,a0 ossia nel LEA START,a0. Invece dando un
  67. nome a ogni PUNTO DEL PROGRAMMA, come si da il nome ad un fiume, si indica
  68. con quel nome l'indirizzo di partenza di quella cosa (E NON IL SUO CONTENUTO!
  69. SE FACCIO LEA START,A0, in A0 non va il contenuto di start! ma dove e'!).
  70. Durante l'assemblaggio l'assemblatore si occupa di sistemare tutte le
  71. label e sostituirle con gli indirizzi che rappresentano.
  72. questo programmino fa una pulizia a partire dall'indirizzo messo in a0, fino
  73. all'indirizzo che mettiamo in a1: per verificare cio', assemblate con A e
  74. fate M START (prima di fare j) per verificare che sono stati messi in quel
  75. punto dei $fe consecutivi; come ulteriore verifica fate D Inizio, e noterete
  76. che in a0 viene messo lo stesso numero che compare accanto al primo LINE_F,
  77. ossia l'indirizzo del primo $FE che viene interpretato come LINE_F da
  78. ASMONE, mentre in a1 viene messo l'indirizzo di THEEND, ossia come potete
  79. vedere la fine dei $FEFE e l'inizio degli 00000000. Ora eseguite con il J:
  80. se fate D INIZIO potete verificare che i bytes sono stati azzerati (e ora
  81. sono interpretati come ORI.B #$0,d0), allo stesso modo con M START potete
  82. verificarlo, inoltre potete verificare che A0 ed A1 hanno lo stesso valore.
  83. ORA VI INSEGNERO' UNA UTILITA' DELL'ASMONE MOLTO CARINA PER VERIFICARE IL
  84. FUNZIONAMENTO DEI VOSTRI PROGRAMMI:
  85. invece di fare A, provate a fare AD!!!!!
  86. In questo modo dopo aver assemblato enterete nel DEBUGGER!!!!
  87. CALMA E SANGUE FREDDO: vi apparira' il sorgente cosi' come lo avete scritto,
  88. e al lato destro avrete sotto controllo tutti i registri che appaiono in
  89. una colonna uno sotto l'altro: d0,d1,d2..a0,a1,a2.. eccetera.
  90. Noterete che la prima linea del listato, in questo caso lea START,a0, e'
  91. scritta in negativo: questo evidenzia che siamo a quella linea. Ora potete
  92. controllare l'esecuzione del programma istruzione dopo istruzione verificando
  93. cosa avviene nei registri! Nell'ultima linea in basso si vedono le istruzioni
  94. disassemblate come col comando D una alla volta, con l'indirizzo all'estrema
  95. sinistra, seguito dall'istruzione in formato BYTES, seguito dall'istruzione
  96. in formato COMANDO (es. CLR.L (a0)+, che in bytes verificherete che e' $4298)
  97. Per eseguire una istruzione alla volta e andare alla seguente basta premere
  98. il tasto che sposta il cursore in avanti, quello con la freccia rivolta
  99. verso destra: noterete come dopo aver eseguito la prima istruzione,
  100. in a0 sara' messo l'indirizzo di START, mentre dopo la seconda sara'
  101. caricato l'indirizzo di THEEND; scendendo nel loop noterete come a0
  102. ogni volta sara' aumentato di 4 e come si ritornera' a CLELOOP
  103. dopo il BNE fino a che a0 non avra' raggiunto il valore di a1.
  104. Una volta raggiunto l'RTS della fine, o se volete anche prima, potete
  105. uscire dal debugger con il tasto ESC.
  106. Se contate le volte che viene eseguito il CLR.L (a0)+ verificherete che
  107. viene eseguito 10 volte, infatti per pulire 40 bytes una long alla volta,
  108. ossia 4 bytes allla volta, occorranno 10 passaggi (10*4=40).
  109. Provate a modificare il CLR.L (a0)+ con CLR.W (a0)+ e noterete che sono
  110. necessari 20 passaggi (infatti 20*2=40) e che ogni volta a0 e' aumentato
  111. di 2, mentre sostituendolo con CLR.B (a0)+ serviranno 40 passaggi e il
  112. registro a0 sara' incrementato di 1 ogni volta.
  113. Per verifica caricate nuovamente i listati visti fino ad ora e seguiteli
  114. passo passo con il comando AD.
  115. NOTA: il debugger non puo' essere impiegato per tutti i programmi, perche'
  116. quelli che disabilitano il sistema operativo disabilitano anche il debugger!
  117.  
  118. Per sincerarvi che viene pulito tutto quello che si trova tra la label START:
  119. e la label THEEND:, sia che siano 40 bytes che 200 o altri, infatti provate
  120. a fare questa modifica:
  121.  
  122. START:
  123.     dcb.b    80,$fe    ; METTI QUA IN MEMORIA 80 bytes $fe.
  124.  
  125. THEEND:        ; questa label segna la fine degli 80 bytes...
  126.  
  127. Se fate gli stessi passaggi con AD noterete che vengono fatti il doppio dei
  128. cicli, perche' la distanza tra START e  THEEND e' raddoppiata.
  129. Infatti immaginatevi che il programma sia una strada, in cui START corrisponde
  130. al numero civico 10... nel primo caso ci sono 40 bytes di distanza, quindi
  131. THEEND sarebbe l'equivalente del numero civico 50 (10+40), e se l'abitante
  132. in START deve andare a trovare l'amico che sta a THEEND deve fare 40 passi
  133. lunghi 1 byte. Se invece START rappresenta sempre il numero 10, ma l'amico
  134. THEEND e' andato a stare a 80 bytes di distanza, anziche' 40, si trovera'
  135. all'indirizzo 90, e l'amico START per raggiungerlo dovra' fare questa volta
  136. 80 passi da un byte.
  137.  
  138.